#include "arbrebdd.h"

ArbreBdd::ArbreBdd(QWidget *parent)
    : QWidget(parent)
{
    // On met en place l'interface graphique
    setupUi();
}

/*
 * Méthode contenant l'instantiation et la configuration de tous les éléments graphiques
 */
void ArbreBdd::setupUi()
{
    vbPrincipale = new QVBoxLayout;

    tree = new QTreeWidget(this);
    refreshAction = new QAction("Actualiser", tree);

    QObject::connect(refreshAction, SIGNAL(triggered()),this, SLOT(refresh()));
    tree->addAction(refreshAction);
    tree->setContextMenuPolicy(Qt::ActionsContextMenu);

    tree->setHeaderLabels(QStringList("Base de données"));
    tree->header()->setSectionResizeMode(QHeaderView::Stretch);

    vbPrincipale->addWidget(tree);
    vbPrincipale->setContentsMargins(0,0,0,0);
    setLayout(vbPrincipale);

}

/*
 * Méthode retournant une chaine de caractère comportant la bdd, l'utilisateur, et le driver.
 * Cette chaine sera affichée dans le tree widget en toplevel
 */
QString ArbreBdd::bddNomAffiche(QSqlDatabase db) const
{
    // On récupère le nom du driver
    QString nomAffiche = db.driverName();

    // On met ':' après le nom du driver
    nomAffiche.append(QLatin1Char(':'));

    // Si on connait le nom de l'utilisateur
    if (!db.userName().isEmpty())
    {
        // On rajoute le nom de l'utilisateur suivi de @ à la suite de "driver:"
        nomAffiche.append(db.userName()).append(QLatin1Char('@'));
    }

    // On rajoute le nom de la BDD
    nomAffiche.append(db.databaseName());

    return nomAffiche;
}

/*
 * Méthode permettant de rafraichir l'arbre après une modification sur la structure de la base de données
 */
void ArbreBdd::refresh()
{
    // On vide le treeWidget
    tree->clear();

    // On récupère le nom de toutes les connexions
    QStringList connectionNames = QSqlDatabase::connectionNames();

    bool existeBddActive = false;

    // Pour toutes les connexions
    for (int i = 0; i < connectionNames.count(); i++)
    {
        // On crée un item de l'arbre
        QTreeWidgetItem *root = new QTreeWidgetItem(tree);

        // On récupère la base de données (sans l'ouvrir)
        QSqlDatabase db = QSqlDatabase::database(connectionNames.at(i), false);

        // On définit le nom de la base de données dans l'item
        root->setText(0, bddNomAffiche(db));

        // Si la base de données est la même que la base de données active
        if (connectionNames.at(i) == bddActive)
        {
            existeBddActive = true;
            bddActive = QSqlDatabase::connectionNames().value(tree->indexOfTopLevelItem(root));
        }

        // Si la base de données est ouverte
        if(db.isOpen())
        {
            // On récupère la liste de ses tables
            QStringList tables = db.tables();

            // On nomme chacune d'entre elles
            for (int t = 0; t < tables.count(); t++)
            {
                QTreeWidgetItem *table = new QTreeWidgetItem(root);
                table->setText(0, tables.at(t));
            }
        }
    }

    // S'il n'existe pas de base de données active, alors on active la première
    if(!existeBddActive)
    {
        bddActive = QSqlDatabase::connectionNames().value(0);
    }
}

/*
 * Retourne la base de données active
 */
QSqlDatabase ArbreBdd::currentDatabase() const
{
    return QSqlDatabase::database(bddActive);
}
